/* 长连接测试1: 创建一个客户端持续给服务端发送数据,直到超过超时时间看看是否正常 */
#include "../source/server.hpp"
#include <fstream>

static bool ReadFile(const std::string& filename, std::string* buf)
{
    std::ifstream ifs(filename, std::ios::binary);
    if (ifs.is_open() == false)
    {
        printf("open %s file failed!", filename.c_str());
        return false;
    }
    size_t fsize = 0;
    ifs.seekg(0, ifs.end);
    fsize = ifs.tellg();
    ifs.seekg(0, ifs.beg);
    
    buf->resize(fsize);
    ifs.read(&(*buf)[0], fsize);
    if (ifs.good() == false)
    {
        printf("read %s file failed!!", filename.c_str());
        ifs.close();
        return false;
    }
    ifs.close();
    return true;
}


int main()
{
    // 测试长连接
    // Socket cli_sock;
    // cli_sock.CreateClient(8080, "127.0.0.1");
    // std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    // while (1)
    // {
    //     assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //     char buffer[1024] = {0};
    //     assert(cli_sock.Recv(buffer, 1023));
    //     DBG_LOG("[%s]", buffer);
    //     sleep(3);
    // }
    // cli_sock.Close();


    // // 超时测试连接, 给服务端发送一次数据,不动了, 查看服务器是否会关闭
    // Socket cli_sock;
    // cli_sock.CreateClient(8080, "127.0.0.1");
    // std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    // // assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    // // char buffer[1024] = {0};
    // // assert(cli_sock.Recv(buffer, 1023));
    // // DBG_LOG("[%s]", buffer);
    // sleep(15);
    // cli_sock.Close();


    // // 给服务器发送一个数据,告诉服务器,要发送1024字节的数据,但实际发送的数据不足1024,查看服务器处理结果
    // // 1.如果数据只发送一次,服务器得不到完整的请求,就不会进行业务处理,客户端也就得不到响应,最终超时关闭连接
    // // 2.连着给服务器发送多次 小的请求, 服务器会将后边的请求当作前边请求的正文进行处理,而后便处理的时候有可能会因为处理出错而导致关闭
    // Socket cli_sock;
    // cli_sock.CreateClient(8080, "127.0.0.1");
    // std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 100\r\n\r\n";
    // while (1)
    // {
    //     assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //     assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //     assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //     char buffer[1024] = {0};
    //     assert(cli_sock.Recv(buffer, 1023));
    //     DBG_LOG("[%s]", buffer);
    //     sleep(3);
    // }
    // cli_sock.Close();


    // 业务处理超时,查看服务器的处理情况
        // 当服务器达到了一个性能瓶颈,再一次业务处理中花费了太长的时间 (超过了服务器设置的非活跃超时时间)
        // 1.在一次业务处理中耗费太长时间,导致其他的连接也被连累超时,其他的连接有可能会被拖累的超时释放
        // 假设现在   12345文件描述符就绪了, 在处理1的时候花费了30s处理完了,超时了,导致2345描述符因为长时间没有刷新活跃度
        //  1.如果接下来的2345描述符都是通信连接描述符,如果就绪了,则并不影响,因为接下来就会进行处理并刷新活跃度
        //  2.如果解下来的2好描述符是定时器事件描述符,定时器触发超时,执行定时任务,就会被345描述符给释放掉
        // 这时候一旦345描述符对应的连接被释放,接下来在处理345事件的时候就会导致程序崩溃 (内存访问错误)
        // 因此这时候,在本次事件处理中,并不能直接对连接进行释放,而应该将释放操作压入到任务池中
        // 等到事件处理完了,执行任务池中的任务的时候,再去释放 
    // signal(SIGCHLD, SIG_IGN);
    // for (int i = 0; i < 10; i++)
    // {
    //     pid_t pid = fork();
    //     if (pid < 0)
    //     {
    //         DBG_LOG("fork error");
    //         return -1;
    //     }
    //     else if (pid == 0)
    //     {
    //         Socket cli_sock;
    //         cli_sock.CreateClient(8080, "127.0.0.1");
    //         std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    //         while (1)
    //         {
    //             assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //             char buffer[1024] = {0};
    //             assert(cli_sock.Recv(buffer, 1023));
    //             DBG_LOG("[%s]", buffer);
    //         }
    //         cli_sock.Close();
    //         exit(0);
    //     }
    // }
    // while (1) sleep(1);


    // // 一次性给服务器发送多条请求,然后查看服务器的处理结果
    // // 每一条请求都应该得到正常的处理
    // Socket cli_sock;
    // cli_sock.CreateClient(8080, "127.0.0.1");
    // std::string req = "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    // req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    // req += "GET /hello HTTP/1.1\r\nConnection: keep-alive\r\nContent-Length: 0\r\n\r\n";
    // while (1)
    // {
    //     assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    //     char buffer[1024] = {0};
    //     assert(cli_sock.Recv(buffer, 1023));
    //     DBG_LOG("[%s]", buffer);
    //     sleep(3);
    // }
    // cli_sock.Close();



    // // 大文件传输测试,给服务器上传一个大文件,服务器将文件保存下来,观察处理结果
    // // 上传的文件,和服务器保存的文件一直
    // Socket cli_sock;
    // cli_sock.CreateClient(8080, "127.0.0.1");
    // std::string req = "PUT /1234.txt HTTP/1.1\r\nConnection: keep-alive\r\n";
    // std::string body;
    // ReadFile("./hello.txt", &body);
    // req += "Content-Length: " + std::to_string(body.size()) += "\r\n\r\n";
    // assert(cli_sock.Send(req.c_str(), req.size()) != -1);
    // assert(cli_sock.Send(body.c_str(), body.size()) != -1);
    // char buffer[1024] = {0};
    // assert(cli_sock.Recv(buffer, 1023));
    // DBG_LOG("[%s]", buffer);
    // sleep(3);
    // cli_sock.Close();


    // 性能压力测试 -- 使用webbench

    return 0;
}